import { showNoneIconToast } from './toast'
import request from './request'
import { createUUID } from './uuid'

/**
 * 选择文件或拍摄
 */
export const chooseFile = ({ count, mediaType, sourceType }) => {
  return new Promise((resolve, reject) => {
    uni.chooseMedia({
      count,
      mediaType,
      sourceType,
      // 成功回调
      success: (res) => {
        // 临时文件列表长度为零
        if (!res.tempFiles.length) {
          // 更新Promise状态为成功态，传入参数为 null
          resolve(null)
          return
        }
        // 解构
        const [{ tempFilePath, size }] = res.tempFiles
        // 判断文件大小：约定文件大小不超过5M
        const isGT5M = size > 5 * 1024 * 1024
        if (isGT5M) {
          showNoneIconToast('图片大小不能超过5M')
          // 更新Promise状态为成功态，传入参数为 null
          resolve(null)
          return
        }
        // 更新Promise状态为成功态，传入参数为临时文件路径
        resolve(tempFilePath)
      },

      // 失败回调
      fail: (error) => {
        // 错误提示
        showNoneIconToast(error.errMsg)
        // 更新Promise状态为失败，并传入错误对象
        reject(new Error(error.errMsg))
      }
    })
  })
}

/**
 * 获取文件签名
 */
const getFileSignApi = () => {
  return request({
    method: 'GET',
    url: '/file/sign'
  })
}

/**
 * 上传文件至 OSS 服务器
 * 上传成功，会得到一个完整的网络地址
 */
export function uploadFile2OSS({ tempFilePath, fileType = 'image' }) {
  return new Promise(async (resolve, reject) => {
    try {
      // 获取直传签名
      const signRes = await getFileSignApi()
      // 解构
      const {
        host: url,
        pathPrefix,
        policy,
        signature,
        ossAccessKeyId
      } = signRes
      // 获取文件扩展名
      const fileExt = tempFilePath.slice(
        tempFilePath.lastIndexOf('.') + 1
      )
      // 构造 formData
      const formData = {
        key: `${pathPrefix}${createUUID()}.${fileExt}`,
        policy,
        OSSAccessKeyId: ossAccessKeyId,
        signature,
        success_action_status: 200
      }
      // 上传文件至 OSS
      uni.uploadFile({
        url,
        fileType,
        filePath: tempFilePath,
        name: 'file',
        formData,
        success: (res) => {
          if (200 === res.statusCode) {
            // 文件路径
            // url: 域名（基础地址）
            // formData.key: 后半段地址（文件存储在云服务器的路径）
            // 把两个字符串拼接到一起，得到一个真实的网络图片路径
            resolve(url + formData.key)
          } else {
            showNoneIconToast(res.errMsg)
            reject(new Error(res.errMsg))
          }
        },
        fail: (error) => {
          showNoneIconToast(error.errMsg)
          reject(new Error(error.errMsg))
        },
        complete: () => {
          uni.hideLoading()
        }
      })
    } catch (e) {
      reject(new Error(e.message))
    }
  })
}
